package cn.tedu._05mvcboot02.controller;

import cn.tedu._05mvcboot02.common.response.JsonResult;
import cn.tedu._05mvcboot02.common.response.StatusCode;
import cn.tedu._05mvcboot02.mapper.UserMapper;
import cn.tedu._05mvcboot02.pojo.dto.UserInsertDTO;
import cn.tedu._05mvcboot02.pojo.dto.UserUpdateDTO;
import cn.tedu._05mvcboot02.pojo.entity.User;
import cn.tedu._05mvcboot02.pojo.vo.UserListVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;
@Api(tags = "用户功能")
@Slf4j
//@Controller
/**
 * RestController注解:
 *  1.组合注解:等价于Controller注解+ResponseBody注解
 *  2.类上添加了此注解，所有的控制器方法均无需再添加@ResponseBody注解
 */
@RestController
/**
 * RequestMapping注解:
 *  1.请求注解:根据请求地址定位对应的控制器方法
 *  2.添加位置:可以添加在类上,也可以添加在控制器方法上
 */
@RequestMapping("v1/users/")
public class UserController {
    //自动装配
    @Autowired(required = false)
    private UserMapper userMapper;

    //1.添加用户-接口说明
    @ApiOperation(value = "添加用户")
    @PostMapping(value = "insert")
//    @ResponseBody
    public JsonResult userInsert(@RequestBody @Validated UserInsertDTO userInsertDTO){
        log.debug("userInsertDTO"+userInsertDTO);
        /*
            梳理当前功能的业务逻辑,确定接口
            1.获取请求体数据
            2.数据表中插入数据[确定接口方法]
            3.返回响应
         */
        //插入数据使用实体类
        User user = new User();
        //复制属性:把userInsertDTO中属性值赋值给user对象中
        BeanUtils.copyProperties(userInsertDTO,user);
        user.setCreated(new Date());
        //调用接口方法
        userMapper.userInsert(user);
        //返回响应
        return new JsonResult(StatusCode.OPERATION_SUCCESS);
    }

    //2.用户列表-接口说明
    @ApiOperation(value = "用户列表")
    @GetMapping("userList")
//    @ResponseBody
    public JsonResult userList(){
        /*
            梳理业务逻辑,确定接口方法
            1.查询所有用户的信息[接口1]
            2.返回响应
         */
        return new JsonResult(StatusCode.OPERATION_SUCCESS,userMapper.userList());
    }

    //3.删除用户-接口说明
    @ApiOperation(value = "删除用户")
    @ApiImplicitParam(name = "id",value = "用户编号",required = true,example = "1",dataType = "int")
    @GetMapping("delete")
//    @ResponseBody
    public JsonResult userDelete(int id){
        if (id<0){
            throw new  IllegalArgumentException("id值是无效的");
        }
        /*
            1.删除指定用户[接口1]
            2.返回响应
         */
        log.debug("id"+id);
        userMapper.userDelete(id);
        return new JsonResult(StatusCode.OPERATION_SUCCESS);
    }

    //4.更新用户-接口说明
    @ApiOperation(value = "更新用户")
    @PostMapping("update")
//    @ResponseBody
    public JsonResult userUpdate(UserUpdateDTO userUpdateDTO){
        log.debug("userUpdateDTO"+userUpdateDTO);
        userMapper.userUpdate(userUpdateDTO);
        return new JsonResult(StatusCode.OPERATION_SUCCESS);
    }

    //5.根据用户id查询指定用户的信息:用户名和密码
    /**
     * @PathVariable注解
     *  1.请求地址:v1/users/selectById/用户id
     *  2.请求方法:GET
     *  3.返回响应:UserListVO
     */
    @ApiOperation(value = "查询指定用户信息")
    @ApiImplicitParam(name = "id",value = "用户编号",required = true,example = "1",dataType = "int")
    @GetMapping("selectById/{id}")
    public JsonResult selectById(@PathVariable int id){
        log.debug("id"+id);
        return new JsonResult(StatusCode.OPERATION_SUCCESS,userMapper.selectById(id));
    }
}
